package com.wavecoler.professor.servlets;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.ws.rs.core.MediaType;

import com.google.gson.Gson;

import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;
import com.wavecoler.professor.bots.BotUsers;
import com.wavecoler.professor.objects.User;
import com.wavecoler.utilities.Utilities;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

@SuppressWarnings("serial")
public class UserActionServlet extends HttpServlet {
	
	private static Logger LOG = Logger.getLogger(BotUsers.class.getName());
	
	public static final int INSERT = 1;
	public static final int UPDATE = 2;
	public static final int DELETE = 3;
	public static final int FIND_USER = 4;
	public static final int DEACTIVATE = 5;
	public static final int ACTIVATE = 6;
	public static final int SET_ONLINE = 7;
	public static final int SET_NOT_ONLINE = 8;
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Client service = Client.create();
		WebResource webResource = service.resource("http://wavecoler.lag.itesm.mx:8080/WaveColerWebServices/rest/users");
		try {
			//call web service
			System.out.println("Creando Web Service...");
			LOG.info("Creando Web Service");
			int action = Integer.parseInt(request.getParameter("action"));
			System.out.println("Entre a UserAction servlet...action = "+action);
			LOG.info("UserActionServlet...Action="+action);		
			User u = null;
			ClientResponse respuesta;
			String userName;
			switch(action) {
			   case INSERT: 
				 u = mapDataToObject(request);
				 LOG.info("Insertando datos de "+u);
				 System.out.println("Insertando datos de "+u.getUserName());
				 LOG.info("Llamando al servicio web "+"http://wavecoler.lag.itesm.mx:8080/WaveColerWebServices/rest/users/add");
                 respuesta = webResource.path("/add").type(MediaType.APPLICATION_JSON).put(ClientResponse.class,u);
			     if (respuesta==null)
			    	 LOG.info("Respuesta del servicio web es null");
			     else {
				     LOG.info("Respuesta de envio... estado: " + respuesta.getStatus());
				     System.out.println("Respuesta de envio... estado: " + respuesta.getStatus());
			      }
			     break;
			   case UPDATE:  
				   u = mapDataToObject(request);
				   System.out.println("Modificando datos de "+u.getUserName());
				   respuesta = webResource.path("/modify").type(MediaType.APPLICATION_JSON).put(ClientResponse.class,u);
				   System.out.println("Respuesta de envio... estado: " + respuesta.getStatus());
				   break;		   
			   case DELETE:  
				   userName = request.getParameter("username");
				   System.out.println("Borrando datos de: "+userName);
				   respuesta = webResource.path("/deleteUser/"+userName).delete(ClientResponse.class);
				   System.out.println("Respuesta de envio... estado: " + respuesta.getStatus());
			       break;
			   case FIND_USER:
				   userName = request.getParameter("username");
				    System.out.println("Buscando datos de "+userName);
					respuesta = webResource.path("/usuario/"+userName+"/").get(ClientResponse.class);
				    System.out.println("Respuesta de envio... estado: " + respuesta.getStatus());
					break;
			   case DEACTIVATE: 
				   userName = request.getParameter("username");
				   System.out.println("Desactivando datos de "+userName);
				   respuesta = webResource.path("/deactivateUser/"+userName).type(MediaType.APPLICATION_JSON).put(ClientResponse.class);
				   System.out.println("Respuesta de envio... estado: " + respuesta.getStatus());
				   break;			   
			   case ACTIVATE: 
				   userName = request.getParameter("username");
				   System.out.println("Activando datos de "+userName);
				   respuesta = webResource.path("/activateUser/"+userName).type(MediaType.APPLICATION_JSON).put(ClientResponse.class);
				   System.out.println("Respuesta de envio... estado: " + respuesta.getStatus());
				   break;
			   case SET_ONLINE: 
				   userName = request.getParameter("username");
				   System.out.println("Definiendo status en linea de "+userName);
				   respuesta = webResource.path("/setOnlineUser/"+userName).type(MediaType.APPLICATION_JSON).put(ClientResponse.class);
				   System.out.println("Respuesta de envio... estado: " + respuesta.getStatus());
				   break;				   
			   case SET_NOT_ONLINE: 
				   userName = request.getParameter("username");
				   System.out.println("Definiendo status en linea de "+userName);
				   respuesta = webResource.path("/setNotOnlineUser/"+userName).type(MediaType.APPLICATION_JSON).put(ClientResponse.class);
				   System.out.println("Respuesta de envio... estado: " + respuesta.getStatus());
				   break;
			   default:
				   System.out.println("Invalid Action!");
				   break;
			}		
			//consultar datos de todos los usuarios
			List<User> usersList = new ArrayList<User>();
			
			respuesta = webResource.accept("application/json").get(ClientResponse.class);
			LOG.info("Estado de obtener lista de usuarios ya registrados : " + respuesta.getStatus());
			System.out.println("Estado de obtener la lista: " + respuesta.getStatus());
			
			final JSONObject jsonArr = respuesta.getEntity(JSONObject.class);
			System.out.println("Pude obtener el json...");
			JSONArray ble = jsonArr.getJSONArray("user");
			System.out.println("Si pude obtener el arreglo...");
			System.out.println(ble.toString());
			System.out.println("Arreglo json es: " + ble.length());
			for(int i = 0; i < ble.length();i++){
				//Se puede agregar el crear un nuevo usuario, agarrar los datos del json, parsearlo en el nuevo usuario y agregar el nuevo usuario
				//a la lista con los datos ya parseados.
				Gson gson = new Gson();
	//			GsonBuilder gsonbuilder = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss Z"); 
//				User user = new User();
				JSONObject holo = ble.getJSONObject(i);
				BufferedReader br = new BufferedReader(new StringReader(holo.toString()));
				User blee = gson.fromJson(holo.toString(), User.class);
				
				System.out.println("Usuario: " +  blee.getUserName());
				System.out.println("Fecha de nacimiento: "+ blee.getBirthDay() + "/" + blee.getBirthMonth() +"/"+ blee.getBirthYear());
//				user.setFirstName(holo.getString("firstName"));
				usersList.add(blee);
			}
			//	Convertir respuesta a lista de usuarios
			HttpSession session = request.getSession();
			session.setAttribute("users",usersList);
			LOG.info("Voy a JSP");
			String address = "jsps/ShowUsers.jsp";
			System.out.println("Lista tamaño usuarios: " + usersList.size());
		    RequestDispatcher dispatcher = request.getRequestDispatcher(address);
		    dispatcher.forward(request, response);		
		} catch (	Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
        doPost(request,response);
	}
	
	private User mapDataToObject(HttpServletRequest request) {
	    String firstName = request.getParameter("firstname");
	    String middleName = request.getParameter("middlename");
	    String lastName = request.getParameter("lastname");
	    char gender = request.getParameterValues("gender")[0].charAt(0);		
	    String birthDate = request.getParameter("dateofbirth");
	    String userName = request.getParameter("username");
	    String type = request.getParameter("expert");
	    String pass = request.getParameter("password");
	    if (type == null)
	    		type = "Student";
	    else
	    		type = "Professor";  
	    Date birthdate = null;
	    try {
	     SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
 	     birthdate = sdf.parse(birthDate);
			System.out.println("Fecha es:" + birthdate);
 	     LOG.info("Fecha de nacimiento"+birthdate.toString());
	    } catch (ParseException e)
	      {System.out.println("Exception :"+e); 
	    }
	    SimpleDateFormat dia = new SimpleDateFormat("dd");
	     SimpleDateFormat mes = new SimpleDateFormat("MM");
	     SimpleDateFormat anio = new SimpleDateFormat("yyyy");
	     
	    User u = new User();
	    u.setFirstName(firstName);
	    u.setMiddleName(middleName);
	    u.setLastName(lastName);
	    u.setGender(gender);
	    u.setUserName(userName);
	    u.setUserType(type);
	    u.setOnline(false);
	    u.setActive(true);
	    u.setPassword(Utilities.toMd5(pass));
	    if(birthdate != null){
	    u.setBirthDay(dia.format(birthdate));
		u.setBirthMonth(mes.format(birthdate));
		u.setBirthYear(anio.format(birthdate));
	    }
	    return u;
	  }
}
